# Hocuspocus realtime-collaboration server image.
#
# Built from the monorepo root (build context = repository root) so the
# Docker layer cache can reuse pnpm install layers shared with the api /
# worker / web images. Final image is `node:20-bookworm-slim` running
# `apps/hocuspocus/dist/index.js` on port 1234.
FROM --platform=linux/amd64 node:20-bookworm-slim AS base

ENV NODE_ENV="production"
ENV CI="true"
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"

RUN apt-get update \
  && apt-get install -y --no-install-recommends openssl curl \
  && rm -rf /var/lib/apt/lists/* \
  && corepack enable \
  && corepack prepare pnpm@10.33.0 --activate

FROM base AS deps
WORKDIR /myapp
ADD package.json pnpm-lock.yaml pnpm-workspace.yaml ./
ADD prisma prisma
ADD apps apps
ADD packages packages
RUN pnpm install --frozen-lockfile --prod=false

FROM base AS production-deps
WORKDIR /myapp
COPY --from=deps /myapp/node_modules /myapp/node_modules
ADD package.json pnpm-lock.yaml pnpm-workspace.yaml ./
ADD apps apps
ADD packages packages
RUN pnpm prune --prod

FROM base AS build
WORKDIR /myapp
COPY --from=deps /myapp/node_modules /myapp/node_modules
COPY --from=deps /myapp/apps /myapp/apps
COPY --from=deps /myapp/packages /myapp/packages
ADD package.json pnpm-lock.yaml pnpm-workspace.yaml ./
ADD prisma prisma
ADD prisma.config.ts prisma.config.ts
ADD tsconfig.json tsconfig.json
ADD packages/db packages/db
RUN pnpm exec prisma generate
RUN pnpm --filter @hivegrid/db build
ADD . .
RUN pnpm --filter @hivegrid/hocuspocus build

FROM base AS hocuspocus
ARG APP_REVISION=unknown
ENV NODE_ENV="production"
ENV HOCUSPOCUS_PORT="1234"
ENV HOCUSPOCUS_HOST="0.0.0.0"
ENV APP_REVISION="${APP_REVISION}"
LABEL org.opencontainers.image.revision="${APP_REVISION}"
EXPOSE 1234

WORKDIR /myapp
COPY --from=production-deps /myapp/node_modules /myapp/node_modules
COPY --from=build /myapp/package.json /myapp/package.json
COPY --from=build /myapp/pnpm-lock.yaml /myapp/pnpm-lock.yaml
COPY --from=build /myapp/pnpm-workspace.yaml /myapp/pnpm-workspace.yaml
COPY --from=build /myapp/tsconfig.json /myapp/tsconfig.json
COPY --from=build /myapp/apps/hocuspocus/package.json /myapp/apps/hocuspocus/package.json
COPY --from=deps /myapp/apps/hocuspocus/node_modules /myapp/apps/hocuspocus/node_modules
COPY --from=build /myapp/apps/hocuspocus/dist /myapp/apps/hocuspocus/dist
COPY --from=build /myapp/packages/db /myapp/packages/db
COPY --from=deps /myapp/packages/db/node_modules /myapp/packages/db/node_modules
COPY --from=build /myapp/packages/db/generated/prisma/client /myapp/packages/db/generated/prisma/client
COPY --from=build /myapp/packages/logger /myapp/packages/logger
COPY --from=deps /myapp/packages/logger/node_modules /myapp/packages/logger/node_modules
COPY --from=build /myapp/prisma /myapp/prisma
COPY --from=build /myapp/prisma.config.ts /myapp/prisma.config.ts

USER node

HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
  CMD node -e "require('net').connect(${HOCUSPOCUS_PORT:-1234}, '127.0.0.1').on('connect', () => process.exit(0)).on('error', () => process.exit(1))"

CMD ["node", "apps/hocuspocus/dist/index.js"]
